"""
类方法、静态方法和实例方法
"""


class Date:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def tomorrow(self):
        """
        实例方法
        """
        self.day += 1

    @staticmethod
    def parse_from_string(date_str):
        year, month, day = tuple(date_str.split("-"))
        # 存在硬编码问题
        return Date(int(year), int(month), int(day))

    @staticmethod
    def valid_str(date_str):
        """
        静态方法的使用场景
        """
        if isinstance(date_str, str):
            year, month, day = tuple(date_str.split("-"))
            if int(year) > 0 and (int(month) > 0 and int(month) <= 12) and (int(day) > 0 and int(day) <= 31):
                return True
            else:
                return False
        else:
            return False

    @classmethod
    def parse_from_str(cls, date_str):
        year, month, day = tuple(date_str.split("-"))
        # 不存在硬编码问题
        return cls(int(year), int(month), int(day))

    def __str__(self):
        return "{year}-{month}-{day}".format(year=self.year, month=self.month, day=self.day)


if __name__ == '__main__':
    # 使用实例方法
    new_day = Date(2018, 4, 19)
    new_day.tomorrow()
    print(new_day)
    # 输出结果：
    """
    2018-4-20
    """

    # 将字符串转换为日期
    date_str = "2018-4-20"
    year, month, day = tuple(date_str.split("-"))
    new_day = Date(int(year), int(month), int(day))
    print(new_day)
    # 输出结果：
    """
    2018-4-20
    """

    # 使用静态方法将字符串转换为日期
    date_str = "2018-4-20"
    new_day = Date.parse_from_string(date_str)
    print(new_day)
    # 输出结果：
    """
    2018-4-20
    """

    # 使用类方法将字符串转换为日期
    date_str = "2018-4-20"
    new_day = Date.parse_from_str(date_str)
    print(new_day)
    # 输出结果：
    """
    2018-4-20
    """

    # 使用静态方判断是否符合日期字符串的要求
    date_str = "2018-4-233"
    print(Date.valid_str(date_str))
    # 输出结果：
    """
    False
    """
